package leetcode;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * @program: datastructureandalogorithm
 * @description:
 * @author: hmx
 * @create: 2021-10-18 13:11
 **/
public class LeetCode242 {

    /**
     * 这题判断两个字符串中字符出现的次数和个数是否都相同，哈希表走起
     * @param s
     * @param t
     * @return
     */
    /*public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        char[] ch1 = s.toCharArray();
        char[] ch2 = t.toCharArray();
        //key为字符串中的字符，值为字符在字符串中出现的次数
        Map<Character, Integer> map1 = new HashMap<>();
        Map<Character, Integer> map2 = new HashMap<>();
        //将字符串1中的字符都放进map中
        for (char c : ch1) {
            map1.put(c, map1.get(c) == null ? 1 : map1.get(c) + 1);
        }
        //将字符串2中的字符都放进map中
        for (char c : ch2) {
            map2.put(c, map2.get(c) == null ? 1 : map2.get(c) + 1);
        }
        //遍历长的那个字符串
        for (char c : ch1) {
            //如果某个字符在两个字符串中出现的次数不相等,返回false
            if (!Objects.equals(map1.get(c), map2.get(c))) {
                return false;
            }
        }
        //只有字符串中出现的每个字符次数都相等时，返回true
        return true;
    }*/


    /**
     * 使用了排序的方法
     * @param s
     * @param t
     * @return
     */
    /*public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        char[] ch1 = s.toCharArray();
        char[] ch2 = t.toCharArray();
        Arrays.sort(ch1);
        Arrays.sort(ch2);
        return Arrays.equals(ch1, ch2);
    }*/

    /**
     * 官方版哈希表法
     * @param s
     * @param t
     * @return
     */
    /*public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        //代表26个字母
        int[] table = new int[26];
        for (int i = 0; i < s.length(); i++) {
            table[s.charAt(i) - 'a']++;
        }
        for (int i = 0; i < t.length(); i++) {
            table[t.charAt(i) - 'a']--;
            if (table[t.charAt(i) - 'a'] < 0) {
                return false;
            }
        }
        return true;
    }*/

    /**
     * 进阶解法: 字符串中包含Unicode字符也支持
     * @param s
     * @param t
     * @return
     */
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        //key为字符串中的字符，值为字符在字符串中出现的次数
        Map<Character, Integer> map = new HashMap<>();
        //将字符串1中的字符都放进map中
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            //map.getOrDefault: 如果不存在映射的值就返回默认值
            map.put(c, map.getOrDefault(c, 0) + 1);
        }
        for (int i = 0; i < t.length(); i++) {
            char c = t.charAt(i);
            map.put(c, map.getOrDefault(c, 0) - 1);
            if (map.get(c) < 0) {
                return false;
            }
        }
        return true;
    }

}
